import sys
import shlex
import colorama  # 用于 Windows 的 ANSI 转义码支持

# 初始化 colorama（Windows 必需）
colorama.init()

# ----------------- 新增交互选择功能 -----------------
def interactive_select(options, prompt="请选择"):
    """
    交互式参数选择函数
    :param options: 可选项列表
    :param prompt: 提示语
    :return: 选中的索引或 None
    """
    current_idx = 0
    max_idx = len(options) - 1

    # 隐藏光标
    print("\033[?25l", end="")
    
    try:
        while True:
            # 清空并重绘选项
            sys.stdout.write("\033[2K\033[G")  # 清空当前行
            print(f"{prompt} (使用 ↑/↓ 选择，回车确认):")
            for i, opt in enumerate(options):
                prefix = "> " if i == current_idx else "  "
                print(f"\033[K{prefix}{opt}")  # \033[K 清除行尾
            sys.stdout.write(f"\033[{len(options)+1}A")  # 移动光标到起始位置

            # 读取输入
            key = sys.stdin.read(1)
            if key == "\x1b":  # 方向键以 \x1b 开头
                key += sys.stdin.read(2)  # 读取后续两个字符

            # 处理按键
            if key in ("\r", "\n"):  # 回车确认
                return current_idx
            elif key == "\x1b[A":  # 上箭头
                current_idx = max(0, current_idx - 1)
            elif key == "\x1b[B":  # 下箭头
                current_idx = min(max_idx, current_idx + 1)
            elif key == "\x03":  # Ctrl+C
                raise KeyboardInterrupt
    finally:
        # 恢复光标并清理屏幕
        print("\033[?25h")  # 显示光标
        print("\033[2J\033[H", end="")  # 清屏

# ----------------- 命令处理函数改造 -----------------
def handle_select(args_dict):
    """交互式选择演示"""
    options = [
        "开始扫描",
        "清理缓存",
        "生成报告",
        "退出向导"
    ]
    
    try:
        idx = interactive_select(options)
        print(f"\n已选择: {options[idx]}")
        # 此处添加实际任务执行逻辑
        # 示例: 根据选项执行不同操作
        if idx == 0:
            print("执行扫描任务...")
        elif idx == 1:
            print("清理缓存中...")
        elif idx == 2:
            print("生成报告文件...")
    except KeyboardInterrupt:
        print("选择已取消")

# ----------------- 主程序改造 -----------------
def print_help():
    help_text = """
可用命令列表:
  help      - 显示本帮助信息
  exit/quit - 退出程序
  select    - 进入交互式选择模式
  greet     - 打招呼（示例: greet --name "Alice"）
  calc      - 简单计算器（示例: calc --op add --x 5 --y 3）
"""
    print(help_text.strip())

def main():
    print("欢迎使用命令行程序 (输入 'help' 查看可用命令)")
    
    while True:
        try:
            user_input = input("\n>>> ").strip()
            if not user_input:
                continue
            
            # 解析输入
            try:
                parts = shlex.split(user_input, posix=False)
            except ValueError as e:
                print(f"参数解析错误: {str(e)}")
                continue
            
            if not parts:
                continue
                
            command = parts[0].lower()
            args_dict = parse_arguments(parts[1:])
            
            # 命令路由
            if command in ("exit", "quit"):
                print("程序退出")
                break
            elif command == "help":
                print_help()
            elif command == "select":
                handle_select(args_dict)
            elif command == "greet":
                handle_greet(args_dict)
            elif command == "calc":
                handle_calc(args_dict)
            else:
                print(f"未知命令: {command}")
                
        except KeyboardInterrupt:
            print("\n检测到 Ctrl+C，输入 'exit' 退出程序")
        except Exception as e:
            print(f"发生错误: {str(e)}")

if __name__ == "__main__":
    main()